/**
 * @file API响应DTO
 * @description 统一API响应格式
 * @author AI Assistant
 * @date 2024-02-26
 */

export class ApiResponse<T> {
  /**
   * 操作是否成功
   */
  success: boolean;
  
  /**
   * 状态码
   */
  code: number;
  
  /**
   * 提示消息
   */
  message: string;
  
  /**
   * 响应数据
   */
  data?: T;
  
  /**
   * 响应时间戳
   */
  timestamp: number;

  /**
   * 构造函数
   * @param options 配置选项
   */
  constructor(options: {
    success?: boolean;
    code?: number;
    message?: string;
    data?: T;
  }) {
    this.success = options.success ?? true;
    this.code = options.code ?? (this.success ? 200 : 500);
    this.message = options.message ?? (this.success ? '操作成功' : '操作失败');
    this.data = options.data;
    this.timestamp = Date.now();
  }

  /**
   * 创建成功响应
   * @param data 响应数据
   * @param message 提示消息
   * @returns 成功响应对象
   */
  static success<T>(data?: T, message?: string): ApiResponse<T> {
    return new ApiResponse<T>({
      success: true,
      code: 200,
      message: message ?? '操作成功',
      data
    });
  }

  /**
   * 创建错误响应
   * @param message 错误消息
   * @param code 错误码
   * @returns 错误响应对象
   */
  static error<T>(message?: string, code?: number): ApiResponse<T> {
    return new ApiResponse<T>({
      success: false,
      code: code ?? 500,
      message: message ?? '操作失败'
    });
  }

  /**
   * 创建分页响应
   * @param data 分页数据
   * @param total 总记录数
   * @param page 当前页码
   * @param pageSize 每页记录数
   * @param message 提示消息
   * @returns 分页响应对象
   */
  static page<T>(data: T[], total: number, page: number, pageSize: number, message?: string): ApiResponse<{
    list: T[];
    total: number;
    page: number;
    pageSize: number;
    totalPages: number;
  }> {
    return ApiResponse.success({
      list: data,
      total,
      page,
      pageSize,
      totalPages: Math.ceil(total / pageSize)
    }, message ?? '查询成功');
  }
} 